package sf.database.jdbc.sql;

import sf.common.wrapper.Page;

import java.sql.Connection;
import java.util.List;
import java.util.Map;

/**
 * 按sql操作
 */
public interface CrudSqlInf {
    /**
     * @param conn
     * @param sql
     * @param parameters 参数
     * @param insertFast 是否快速插入
     * @param batchSize  批处理条数
     * @param pkeys      主键列
     * @param keyValues  返回主键值
     * @return
     * @
     */
    int[] executeBatch(Connection conn, String sql, List<Object[]> parameters, boolean insertFast,
                       int batchSize, List<String> pkeys, List<Map<String, Object>> keyValues);

    /**
     * 快速插入
     * @param conn
     * @param sql
     * @param parameters
     * @return
     */
    int insertFast(Connection conn, String sql, Object... parameters);

    /**
     * 插入
     * @param conn
     * @param pkeys      主键列
     * @param keyValues  返回的主键值
     * @param sql
     * @param parameters
     * @return
     */
    int insert(Connection conn, List<String> pkeys, Map<String, Object> keyValues, String sql, Object... parameters);

    /**
     * @param conn
     * @param sql        sql语句
     * @param parameters 参数
     * @param insertFast 是否快速插入
     * @param pkeys      主键列
     * @param keyValues  返回的主键值
     * @return
     */
    int execute(Connection conn, String sql, Object[] parameters, boolean insertFast,
                List<String> pkeys, Map<String, Object> keyValues);

    /**
     * @param conn
     * @param sql
     * @param parameters
     * @return
     */
    int[] executeBatch(Connection conn, String sql, List<Object[]> parameters);

    /**
     * @param conn
     * @param start
     * @param limit
     * @param beanClass
     * @param sql        原始的语句,不包含限制条数的内容.
     * @param parameters
     * @param <T>
     * @return
     */
    <T> Page<T> selectPage(Connection conn, long start, int limit, Class<T> beanClass, String sql,
                           Object... parameters);

    /**
     * 最原始的分页方法,使用原生sql实现
     * @param conn
     * @param start      起始位置
     * @param limit      限制数量
     * @param beanClass  返回结果,可以为实体类,Map,List,Object[]
     * @param countSql   查询总数的语句
     * @param countParas 查询总数的参数
     * @param pageSql    分页列表查询语句,必须包含了start和limit的内容
     * @param pageParas  分页列表查询参数
     * @param <T>        泛型
     * @return 分页结果
     */
    <T> Page<T> selectRealPageRaw(Connection conn, long start, int limit, Class<T> beanClass, String countSql, Object[] countParas, String pageSql,
                                  Object[] pageParas);

    /**
     * 最原始的分页方法,假分页实现,使用result跳过数据,实现
     * @param conn
     * @param start      起始位置
     * @param limit      限制数量
     * @param beanClass  返回结果,可以为实体类,Map,List,Object[]
     * @param countSql   查询总数的语句
     * @param countParas 查询总数的参数
     * @param listSql    查询列表的语句,不能包含限制条数(start和limit)的内容.
     * @param listParas  查询列表的参数
     * @param <T>        泛型
     * @return 分页结果
     */
    <T> Page<T> selectFakePageRaw(Connection conn, long start, int limit, Class<T> beanClass, String countSql, Object[] countParas, String listSql, Object[] listParas);

    /**
     * 支持结果集更新
     * @param conn
     * @param callback
     * @param sql
     * @param parameters
     * @
     */
    <T> T selectForUpdate(Connection conn, ResultSetCallback<T> callback, String sql, Object... parameters);

    /**
     * 支持结果集更新
     * @param conn
     * @param callback
     * @param context
     * @
     */
    <T> T selectForUpdate(Connection conn, ResultSetCallback<T> callback, SQLContext context);

    /**
     * 支持分页实现的迭代查询
     * @param conn
     * @param ormIt
     * @param beanClass
     * @param usePage    是否使用分页实现迭代.
     * @param sql
     * @param parameters 查询参数
     * @param <T>
     */
    <T> void selectIterator(Connection conn, OrmIterator<T> ormIt, Class<T> beanClass, boolean usePage, String sql, Object... parameters);

    /**
     * @param conn
     * @param ormIt
     * @param beanClass
     * @param usePage
     * @param context
     * @param <T>
     */
    <T> void selectIterator(Connection conn, OrmIterator<T> ormIt, Class<T> beanClass, boolean usePage, SQLContext context);

    /**
     * @param conn
     * @param ormStream
     * @param beanClass
     * @param usePage
     * @param sql
     * @param parameters
     * @param <T>
     */
    <T> void selectStream(Connection conn, OrmStream<T> ormStream, Class<T> beanClass, boolean usePage, String sql, Object... parameters);

    /**
     * @param conn
     * @param ormStream
     * @param beanClass
     * @param usePage
     * @param context
     * @param <T>
     */
    <T> void selectStream(Connection conn, OrmStream<T> ormStream, Class<T> beanClass, boolean usePage, SQLContext context);

    /**
     * @param conn
     * @param callback
     * @param sql
     * @param parameters
     * @param <T>
     * @return
     */
    <T> T selectResultSet(Connection conn, ResultSetCallback<T> callback, String sql, Object... parameters);

    /**
     * @param conn
     * @param psc
     * @param callback
     * @param sql
     * @param parameters
     * @param <T>
     * @return
     */
    <T> T selectResultSet(Connection conn, PreparedStatementCreator psc, ResultSetCallback<T> callback, String sql, Object... parameters);

    /**
     * 主要支持存储过程执行
     * @param con
     * @param action
     * @param <T>
     * @return
     * @
     */
    <T> T execute(Connection con, ConnectionCallback<T> action);

    /**
     * @param conn
     * @param sql
     * @param parameters
     * @return
     * @
     */
    int execute(Connection conn, String sql, Object... parameters);


    /**
     * @param conn
     * @param sql
     * @param parameters
     * @return
     * @
     */
    Object[] selectArray(Connection conn, String sql, Object... parameters);

    /**
     * @param conn
     * @param beanClass
     * @param sql
     * @param parameters
     * @param <T>
     * @return
     * @
     */
    <T> List<T> selectList(Connection conn, Class<T> beanClass, String sql, Object... parameters);

    /**
     * @param conn
     * @param beanClass
     * @param start
     * @param limit
     * @param sql
     * @param parameters
     * @param <T>
     * @return
     */
    <T> List<T> selectList(Connection conn, Class<T> beanClass, long start, int limit, String sql, Object... parameters);

    /**
     * 根据@SqlResultSetMapping设置返回值,返回的为单个对象,或数组对象
     * @param conn
     * @param resultSetMapping @SqlResultSetMapping 中的name
     * @param sql
     * @param parameters
     * @return
     */
    List<?> selectList(Connection conn, String resultSetMapping, String sql, Object... parameters);

    /**
     * 根据@SqlResultSetMapping设置返回值,返回的为单个对象,或数组对象
     * @param conn
     * @param resultSetMapping @SqlResultSetMapping 中的name
     * @param start
     * @param limit
     * @param sql
     * @param parameters
     * @return
     */
    List<?> selectList(Connection conn, String resultSetMapping, long start, int limit, String sql, Object... parameters);

    /**
     * 根据@SqlResultSetMapping设置返回值,返回的为单个对象,或数组对象
     * @param conn
     * @param resultSetMapping @SqlResultSetMapping 中的name
     * @param sql
     * @param parameters
     * @return
     */
    Object selectOne(Connection conn, String resultSetMapping, String sql, Object... parameters);

    /**
     * @param conn
     * @param beanClass
     * @param sql
     * @param parameters
     * @param <T>
     * @return
     * @
     */
    <T> T selectOne(Connection conn, Class<T> beanClass, String sql, Object... parameters);

    /**
     * @param conn
     * @param sql
     * @param paras
     * @return
     * @
     */
    List<Map<String, Object>> select(Connection conn, String sql, Object... paras);
}
